/*
 * @Title: ExceptionAdvice.java
 * @Package com.eeduspace.cibn.controller
 * @Description: TODO
 * @author tbc
 * @date 2015年11月28日 下午9:55:24
 * @version
 */
package com.eduspace.eduplatform.wares.exception;

import com.eduspace.eduplatform.wares.utils.ResultWrapper;
import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * spring-mvc 统一的异常处理
 *
 * @author tbc e-eduspace
 * @version 1.0 create:{2015年11月28日 下午9:55:24}
 */
@Slf4j
@ControllerAdvice
public class ExceptionAdvice {

    /**
     * 处理数据库约束异常
     *
     * @param e MySQLIntegrityConstraintViolationException
     * @return ResultWrapper
     * @author tbc
     * @version 1.0 {2016年10月17日 下午1:35:30}
     */
    @ExceptionHandler(MySQLIntegrityConstraintViolationException.class)
    @ResponseBody
    public ResultWrapper pMySQLIntegrityConstraintViolationException(MySQLIntegrityConstraintViolationException e) {
        log.debug("违反数据库约束->");
        debug(e);
        return ResultWrapper.requestErr("重复数据，违反唯一约束，操作失败");
    }

    /**
     * 经过spring包装的约束异常
     *
     * @param e DuplicateKeyException
     * @return ResultWrapper
     * @author tbc
     * @version 1.0 {2016年10月17日 下午1:35:30}
     */
    @ExceptionHandler(DuplicateKeyException.class)
    @ResponseBody
    public ResultWrapper pDuplicateKeyException(DuplicateKeyException e) {
        log.error("Exception: {}", e.getClass().getName());
        log.error("重复数据，违反唯一约束");
        log.error(e.getMessage());
        return ResultWrapper.requestErr("重复数据，违反唯一约束，操作失败");
    }

//    /**
//     * 当参数手动校验不成功时，手动抛出此异常
//     *
//     * @param e NullParamException
//     * @return ResultWrapper
//     * @author tbc tianbencai@e-eduspace.com
//     * @version 1.0 {2016年1月6日 下午1:43:15}
//     */
//    @ExceptionHandler(NullParamException.class)
//    // @ResponseStatus(HttpStatus.BAD_REQUEST)
//    @ResponseBody
//    public ResultWrapper nullParamException(NullParamException e) {
//        debug(e);
//        return Responses.badRequest(e.getMessage() == null ? "参数错误" : e.getMessage());
//    }

//    /**
//     * 新增失败时
//     *
//     * @param e InsertFailureException
//     * @return ResultWrapper
//     */
//    @ExceptionHandler(InsertFailureException.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    @ResponseBody
//    public ResultWrapper insertFailureException(InsertFailureException e) {
//        debug(e);
//        return Responses.serverErr("新增失败");
//    }
//
//    /**
//     * 更新失败时
//     *
//     * @param e InsertFailureException
//     * @return ResultWrapper
//     */
//    @ExceptionHandler(UpdateFailureException.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
//    @ResponseBody
//    public ResultWrapper updateFailureException(UpdateFailureException e) {
//        debug(e);
//        return Responses.serverErr(e.getMessage());
//    }


    @ExceptionHandler(EmptyResultException.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ResultWrapper Ok(EmptyResultException e) {
        debug(e);
        return ResultWrapper.ok(e.getResult());
    }


    @ExceptionHandler(ParamErrorException.class)
//    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ResultWrapper paramErrorException(ParamErrorException e) {
        debug(e);
        return ResultWrapper.requestErr(e.getMessage());
    }

    @ExceptionHandler(DataBaseExecFailureException.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ResultWrapper dbExecException(DataBaseExecFailureException e) {
        debug(e);
        return ResultWrapper.serverErr(e.getMessage());
    }

    @ExceptionHandler(RuntimeException.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ResultWrapper runtimeException(RuntimeException e) {
        debug(e);
        return ResultWrapper.serverErr(e.getMessage());
    }

    @ExceptionHandler(Exception.class)
//    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    @ResponseBody
    public ResultWrapper processException(Exception e) {
        debug(e);
        log.error("异常堆栈信息=====>>>：");
        for (StackTraceElement s : e.getStackTrace()) {
            log.error(s.toString());
        }
        return ResultWrapper.serverErr("服务器异常: " + e.getMessage());
    }


    private void debug(Exception e) {
        log.debug("ExceptionType=> {}, ExceptionMessage=> {}", e.getClass(), e.getMessage());
    }

    private void info(Exception e) {
        log.info("ExceptionType=> {}, ExceptionMessage=> {}", e.getClass(), e.getMessage());
    }


    private void error(Exception e) {
        log.error("ExceptionType=> {}, ExceptionMessage=> {}", e.getClass(), e.getMessage());
    }


}
